# 异常处理案例

# 1. 基本的异常处理
print("---- 基本的异常处理 ----")

try:
    # 尝试除以零
    result = 10 / 0
except ZeroDivisionError as e:
    print(f"错误: {e}")  # 捕获并打印除以零的错误

# 2. 捕获多个异常
print("\n---- 捕获多个异常 ----")

try:
    # 尝试打开一个不存在的文件
    with open("不存在的文件.txt", "r") as file:
        content = file.read()
except (FileNotFoundError, OSError) as e:
    print(f"错误: {e}")  # 捕获文件未找到或其他操作系统相关的错误

# 3. 捕获所有异常
print("\n---- 捕获所有异常 ----")

try:
    # 尝试将字符串转换为数字
    number = int("abc")
except Exception as e:
    print(f"发生了一个错误: {e}")  # 捕获所有类型的异常

# 4. else 子句
print("\n---- 使用 else 子句 ----")

try:
    number = 10 / 2
except ZeroDivisionError as e:
    print(f"错误: {e}")
else:
    print(f"计算成功，结果是: {number}")  # 只有在没有异常的情况下才会执行

# 5. finally 子句
print("\n---- 使用 finally 子句 ----")

try:
    # 尝试访问一个不存在的文件
    with open("不存在的文件.txt", "r") as file:
        content = file.read()
except FileNotFoundError as e:
    print(f"错误: {e}")
finally:
    print("无论是否发生异常，finally 都会执行")  # 这个部分总会执行

# 6. 自定义异常
print("\n---- 自定义异常 ----")


class NegativeNumberError(Exception):
    """自定义异常，表示数字为负数"""
    pass


def check_positive_number(number):
    if number < 0:
        raise NegativeNumberError("输入的数字是负数！")
    return number


try:
    result = check_positive_number(-5)
except NegativeNumberError as e:
    print(f"自定义异常: {e}")  # 捕获并处理自定义异常

# 7. 异常链（重新抛出异常）
print("\n---- 异常链 ----")


try:
    try:
        # 尝试除以零
        result = 10 / 0
    except ZeroDivisionError as e:
        print(f"捕获到异常: {e}")
        raise ValueError("发生了值错误")  # 重新抛出一个新的异常
except ValueError as e:
    print(f"重新抛出的异常: {e}")  # 捕获重新抛出的异常

